
package UIFE;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import BUFE.*;
import DTL.*;
import java.util.*;
import javax.mail.MessagingException;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpSession;

public class Magasin extends HttpServlet {
   
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            
        //TRAITEMENTS GENERAUX
            
            RequestDispatcher view;
            
            //Récupération ou création de la variable de session
            List<Panier_Entite> panier = new ArrayList<Panier_Entite>();
            Client_Entite client = null;
            HttpSession session = request.getSession(true);
            //Contenu du panier
            if (session.getAttribute("panier") != null)
                panier = (List<Panier_Entite>) session.getAttribute("panier");
            //Prix total du panier
            if (session.getAttribute("panierPrixTotal") == null)
                session.setAttribute("panierPrixTotal",0f);
            //Quantité de références du panier
            if (session.getAttribute("panierQuantite") == null)
                session.setAttribute("panierQuantite",0);
            //Données déjà remplies dans le formulaire du client
            if (session.getAttribute("client") != null)
                client = (Client_Entite) session.getAttribute("client");
            //Indique si le client a déjà tenté d'envoyer une commande
            if (session.getAttribute("rappel") == null)
                session.setAttribute("rappel","n");
            
            
                
            
        //TRAITEMENTS SPECIFIQUES
            
        ////Ajout d'un produit dans le panier
            if ("addtocart".equals(request.getParameter("action")))
            {
                //Récupération du produit
                int idpro = -1;
                Produit_Entite unProduit;
                if (request.getParameter("article") != null && request.getParameter("article").trim().length() > 0)
                    idpro = BUFE.MethodeManager.testEntier(request.getParameter("article"));
                unProduit = ProduitManager.getProduit(idpro);
                
                //Récupération de la quantité
                int quantite = -1;
                if (request.getParameter("quantite") != null && request.getParameter("quantite").trim().length() > 0)
                    quantite = BUFE.MethodeManager.testEntier(request.getParameter("quantite"));
                
                //Ajout dans le panier ou modification des quantités
                if (unProduit.getIdProduit() > 0 && quantite > 0)
                {
                    boolean dejaExistant = false;
                    for (Panier_Entite p : panier)
                        if (p.getUnProduit().getIdProduit() == unProduit.getIdProduit())
                        {
                            p.setQuantite(p.getQuantite()+quantite);
                            dejaExistant = true;
                        }
                    if (!dejaExistant)
                        panier.add(new Panier_Entite(unProduit,quantite));
                
                }
                
                // Enregistrement des modifications dans la session
                session.setAttribute("panier", panier);
                float prixTotal = 0f;
                for (Panier_Entite p : panier)
                    prixTotal += p.getUnProduit().getPrix() * p.getQuantite();
                session.setAttribute("panierPrixTotal",prixTotal);
                session.setAttribute("panierQuantite",panier.size());    
                
                //Renvoi
                view = request.getRequestDispatcher("/panier.jsp");
                view.forward(request, response);
                
            }
                    
        ////Supprimer un produit du panier
            else if ("supprimerDuPanier".equals(request.getParameter("action")))
            {
                //Récupération du produit
                int idpro = -1;
                if (request.getParameter("article") != null && request.getParameter("article").trim().length() > 0)
                    idpro = BUFE.MethodeManager.testEntier(request.getParameter("article"));
                for (int i = 0; i<panier.size(); i++)
                {
                    if (panier.get(i).getUnProduit().getIdProduit() == idpro)
                        panier.remove(i); 
                }
                
                // Enregistrement des modifications dans la session
                session.setAttribute("panier", panier);
                float prixTotal = 0f;
                for (Panier_Entite p : panier)
                    prixTotal += p.getUnProduit().getPrix() * p.getQuantite();
                session.setAttribute("panierPrixTotal",prixTotal);
                session.setAttribute("panierQuantite",panier.size()); 
                
                //Renvoi
                view = request.getRequestDispatcher("/panier.jsp");
                view.forward(request, response);
            
                
            }
                    
        ////Vider complètement le panier
            else if ("viderLePanier".equals(request.getParameter("action")))
            {
                panier.clear();
                session.setAttribute("panier", panier);
                session.setAttribute("panierPrixTotal",0f);
                session.setAttribute("panierQuantite",0);
                
                //Renvoi
                view = request.getRequestDispatcher("/Magasin?action=catalogue");
                view.forward(request, response);
            
            }
                    
        ////Modifier la quantité d'un produit du panier
            else if ("modifierQuantiteDuPanier".equals(request.getParameter("action")))
            {
                //Récupération du produit
                int idpro = -1;
                if (request.getParameter("article") != null && request.getParameter("article").trim().length() > 0)
                    idpro = BUFE.MethodeManager.testEntier(request.getParameter("article"));
                
                //Récupération de la quantité
                int quantite = -1;
                if (request.getParameter("quantite_panier") != null && request.getParameter("quantite_panier").trim().length() > 0)
                    quantite = BUFE.MethodeManager.testEntier(request.getParameter("quantite_panier"));
                
                //Modification de la quantité
                if (idpro > 0 && quantite > 0)
                {
                    for (int i = 0; i<panier.size(); i++)
                    {
                        if (panier.get(i).getUnProduit().getIdProduit() == idpro)
                            panier.get(i).setQuantite(quantite);                         
                    }
                
                
                    // Enregistrement des modifications dans la session
                    session.setAttribute("panier", panier);
                    float prixTotal = 0f;
                    for (Panier_Entite p : panier)
                        prixTotal += p.getUnProduit().getPrix() * p.getQuantite();
                    session.setAttribute("panierPrixTotal",prixTotal);
                    session.setAttribute("panierQuantite",panier.size());
                
                }
                //Renvoi
                view = request.getRequestDispatcher("/panier.jsp");
                view.forward(request, response);
            
            }
                    
        ////Consulter le panier
            else if ("panier".equals(request.getParameter("action")))
            {
                
                //Renvoi
                view = request.getRequestDispatcher("/panier.jsp");
                view.forward(request, response);
                
            }
                    
        ////Page pour passer commande
            else if ("commande".equals(request.getParameter("action")))
            {
                //Préparation des champs selon ce qui est contenu dans la variable de session client
                String nom = "", prenom = "", adresseLivraison = "", adresseFacturation = "", telephone = "", email = "";
                if (client != null)
                {
                        nom = client.getNom();
                        prenom = client.getPrenom();
                        adresseFacturation = client.getAdresseFacturation();
                        adresseLivraison = client.getAdresseLivraison();
                        telephone = client.getTelephone();
                        email = client.getEmail();
                }
                //Valeurs des champs
                request.setAttribute("nom", nom);
                request.setAttribute("prenom", prenom);
                request.setAttribute("add_fact", adresseFacturation);
                request.setAttribute("add_liv", adresseLivraison);
                request.setAttribute("tel", telephone);
                request.setAttribute("email", email);
                
                //Champs valides ou non
                request.setAttribute("testNom",(!nom.isEmpty()) ? "o" : "n");
                request.setAttribute("testPrenom",(!prenom.isEmpty()) ? "o" : "n");
                request.setAttribute("testAdrFact",(!adresseFacturation.isEmpty()) ? "o" : "n");
                request.setAttribute("testAdrLiv",(!adresseLivraison.isEmpty()) ? "o" : "n");
                request.setAttribute("testTel",(MethodeManager.testTelephone(telephone)) ? "o" : "n");
                request.setAttribute("testEmail",(MethodeManager.testEmail(email)) ? "o" : "n");
                
                //Renvoi
                view = request.getRequestDispatcher("/commande.jsp");
                view.forward(request, response);
            }
                    
        ////Envoi de la commande
            else if ("commandeEmail".equals(request.getParameter("action")))
            {
                //Marquage d'un premier passage du client sur la page
                session.setAttribute("rappel", "o");
                //Récupération des valeurs
                String nom = "", prenom = "", adresseLivraison = "", adresseFacturation = "", telephone = "", email = "";
                //Nom
                if (request.getParameter("nom") != null && request.getParameter("nom").trim().length() > 0)
                    nom = request.getParameter("nom").trim();
                
                //Prénom
                if (request.getParameter("prenom") != null && request.getParameter("prenom").trim().length() > 0)
                    prenom = request.getParameter("prenom").trim();
                
                //Adresse de facturation
                if (request.getParameter("add_fact") != null && request.getParameter("add_fact").trim().length() > 0)
                    adresseFacturation = request.getParameter("add_fact").trim();
                
                //Adresse de livraison
                if (request.getParameter("add_liv") != null && request.getParameter("add_liv").trim().length() > 0)
                    adresseLivraison = request.getParameter("add_liv").trim();
                
                //Téléphone
                if (request.getParameter("tel") != null && request.getParameter("tel").trim().length() > 0)
                    telephone = request.getParameter("tel").trim();
                
                //E-mail
                if (request.getParameter("email") != null && request.getParameter("email").trim().length() > 0)
                    email = request.getParameter("email").trim();
                
                //Création d'un client et ajout à la session
                client = new Client_Entite(nom, prenom, telephone, email, adresseLivraison, adresseFacturation);
                if (ClientManager.validate(client) && panier.size() > 0)
                {
                    //Préparation des variables
                    boolean envoiBMG = false, envoiClient = false;
                    float prixTotal = 0f;
                    if (session.getAttribute("panierPrixTotal") != null)
                        prixTotal = MethodeManager.testFloat(session.getAttribute("panierPrixTotal").toString());
                    
                    //Envoi des e-mails
                    try {
                        //Envoi de l'e-mail à BMG
                        MailManager.sendMailOrder(MailManager.orderContent(panier, nom, prenom, telephone, email, adresseFacturation, adresseLivraison, prixTotal));
                        envoiBMG = true;
                        //Envoi de l'e-mail de confirmation au client
                        MailManager.sendMailOrderACK(MailManager.orderContent(panier, nom, prenom, telephone, email, adresseFacturation, adresseLivraison, prixTotal),client.getEmail());
                        envoiClient = true; 
                    }
                    catch (MessagingException e) {
                        //Erreur dans l'envoi d'e-mail (problème avec le serveur SMTP)
                        //Renvoi vers une page d'erreur
                        view = request.getRequestDispatcher("/erreurmail.jsp");
                        view.forward(request, response);
                    }
                    
                    //Si tout s'est bien déroulé
                    if (envoiBMG && envoiClient) {
                        
                    //Remise à blanc des variables de session
                    session.removeAttribute("panier");
                    session.removeAttribute("client");
                    session.removeAttribute("panierPrixTotal");
                    session.removeAttribute("panierQuantite");
                    session.removeAttribute("rappel");

                    //Renvoi
                    view = request.getRequestDispatcher("/cmdvalid.jsp");
                    view.forward(request, response);
                    }
                    
                }
                else
                {
                    if (panier.size() < 1)
                        request.setAttribute("testPanier", "n");
                    session.setAttribute("client", client);
                    //Renvoi
                    view = request.getRequestDispatcher("/Magasin?action=commande");
                    view.forward(request, response);
                }
            
            }
                    
        ////Consulter le catalogue de la société
            else if ("catalogue".equals(request.getParameter("action")))
            {
                //Construction de la liste des catégories
                List<Categorie_Entite> listeCategorie = CategorieManager.getList(true);
                
                //Construction de la liste des produits
                List<Produit_Entite> listeProduit = null;
                String description = "";
                int idcat = -1;
                if (request.getParameter("description") != null && request.getParameter("description").trim().length() > 0)
                    description = request.getParameter("description").trim();
                if (request.getParameter("listeCategorie") != null && request.getParameter("listeCategorie").trim().length() > 0)
                    idcat = BUFE.MethodeManager.testEntier(request.getParameter("listeCategorie"));
                
                if (idcat > 0)
                    listeProduit = ProduitManager.getList(description,Integer.parseInt(request.getParameter("listeCategorie")));
                else
                    listeProduit = ProduitManager.getList(description);
                
                
                //Enregistrement des attributs
                request.setAttribute("listeCategorie", listeCategorie);
                request.setAttribute("selectedID", idcat);
                request.setAttribute("listeProduit", listeProduit);
                request.setAttribute("description", description);
                
                //Renvoi
                view = request.getRequestDispatcher("/catalogue.jsp");
                view.forward(request, response);
            }
                    
        ////Accès à une page non autorisée
            else
            {
                view = request.getRequestDispatcher("/erreur.jsp");
                view.forward(request, response);
            }
            
        } 
        
        finally { 
            out.close();
        }


    }



    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}